import cv2
import numpy as np

# 定义一个函数用于显示图像
def show_img(name, img):
    cv2.imshow(name, img)   # 使用OpenCV的imshow函数显示图像
    cv2.waitKey(0)          # 等待任意键被按下
    cv2.destroyAllWindows()   # 关闭所有OpenCV创建的窗口

# 礼帽 = 原始输入 - 开运算结果
# 读取图像文件，并将其转换为灰度图像
img = cv2.imread('name.jpg', cv2.IMREAD_GRAYSCALE)

# 应用二值化阈值处理
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

# 创建一个3x3的结构元素
kernel = np.ones((3, 3), np.uint8)

# 应用形态学开运算
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# 应用形态学礼帽操作
tophat = cv2.morphologyEx(binary, cv2.MORPH_TOPHAT, kernel)

# 将二值图像、开运算结果和礼帽操作结果垂直堆叠在一起
res = np.vstack((binary, opening, tophat))

# 显示堆叠后的图像
show_img('res', res)